package com.csnf.servlet;

import com.csnf.dao.AuthorDao;
import com.csnf.entity.Authors;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;

/**
 * 处理与作者相关的 HTTP 请求的 Servlet。
 */
@WebServlet("/authorServlet")
public class AuthorServlet extends HttpServlet {
    /**
     * 作者数据访问对象实例。
     */
    private AuthorDao authorDao = new AuthorDao();

    /**
     * 处理 GET 请求的方法。
     *
     * @param req  HTTP 请求对象
     * @param resp HTTP 响应对象
     * @throws ServletException 如果发生 Servlet 异常
     * @throws IOException      如果发生 I/O 异常
     */
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 获取请求参数 "action"
        String action = req.getParameter("action");
        if (action == null) {
            // 如果没有指定动作，则获取所有作者信息
            getAll(req, resp);
        } else {
            // 根据不同的动作执行相应的操作
            switch (action) {
                case "detail":
                    // 显示特定作者的详细信息
                    detailAuthor(req, resp);
                    break;
                case "delete":
                    // 删除作者的操作暂时被注释掉
//                  deleteAuthor(req, resp);
                    break;
                default:
                    // 默认情况下获取所有作者信息
                    getAll(req, resp);
            }
        }
    }

    /**
     * 获取特定作者的详细信息，并将其转发到 authorDetail.jsp 页面。
     *
     * @param req  HTTP 请求对象
     * @param resp HTTP 响应对象
     * @throws ServletException 如果发生 Servlet 异常
     * @throws IOException      如果发生 I/O 异常
     */
    private void detailAuthor(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 获取请求参数 "authorId"
        String authorId = req.getParameter("authorId");
        try {
            // 通过 authorId 查询作者信息
            Authors author = authorDao.getAuthorById(Integer.parseInt(authorId));
            // 将作者信息设置到请求属性中
            req.setAttribute("author", author);
        } catch (Exception e) {
            // 打印堆栈跟踪以调试
            e.printStackTrace();
        }
        // 转发到 authorDetail.jsp 页面显示作者详情
        req.getRequestDispatcher("authorDetail.jsp").forward(req, resp);
    }

    /**
     * 获取所有作者的信息，并将其转发到 authorList.jsp 页面。
     *
     * @param req  HTTP 请求对象
     * @param resp HTTP 响应对象
     * @throws ServletException 如果发生 Servlet 异常
     * @throws IOException      如果发生 I/O 异常
     */
    private void getAll(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        try {
            // 获取所有作者信息
            List<Authors> authorsList = authorDao.getAuthorsList();
            // 将作者列表设置到请求属性中
            req.setAttribute("authorsList", authorsList);
        } catch (Exception e) {
            // 抛出运行时异常以便进一步处理
            throw new RuntimeException(e);
        }
        // 转发到 authorList.jsp 页面显示作者列表
        req.getRequestDispatcher("authorList.jsp").forward(req, resp);
    }
}
